package com.xuecheng.content.service.impl;


import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.model.po.CourseCategory;
import com.xuecheng.content.service.CourseCategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {
    @Autowired
    private CourseCategoryMapper courseCategoryMapper;
    /**
     * 根据课程id查询课程分类
     * @param id
     * @return List<CourseCategoryTreeDto>
     */
    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        //思路：将mapper查询到的集合，存入到map当中，key是id value就是整个CourseCategoryTreeDto
        //然后我们开始遍历集合，如果当前节点的parentid在map中存在，那么我们将当前节点放入到parentid对应的CourseCategoryTreeDto的children中，
        //这样其实是可以查到多层的，因为我们对象是引用类型，我们是对地址操作，所以改变，根本就会改变

        //1. 调用mapper来查询课程分类信息，里面是包括父节点的

        List<CourseCategoryTreeDto> courseCategoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);
        //2. 将dto集合转为map，并且要注意 根节点‘1’也就是传来的参数id 要剔除
        //(k1,k2)->k1)表示如果key重复，则保留第一个
        //filter(item->!id.equals(item.getId()))过滤到第一个节点
        Map<String, CourseCategoryTreeDto> map = courseCategoryTreeDtos.stream().filter(item->!id.equals(item.getId())).collect(Collectors.toMap(CourseCategory::getId, value -> value, (k1, k2) -> k1));

        //3.定义一个结果集合
        List<CourseCategoryTreeDto> result = new ArrayList<>();

        //4.开始遍历传来的集合然后判断父节点是否存在，如果存在，则将当前节点放入到父节点的children中
        courseCategoryTreeDtos.forEach(item->{
            //4.1 先判断是否为一级节点，如果是则要存入结果集合中
            if(item.getParentid().equals(id)){
                result.add(item);
            }else{
                //不是一级节点，那么我们就要将当前节点放入到父节点的children中
                //4.2 在map寻找到对应的父级节点
                CourseCategoryTreeDto courseCategoryTreeDto = map.get(item.getParentid());
                if(courseCategoryTreeDto!=null){
                    //不为空才放入
                    //如果第一次放入的话，需要创建一个children集合
                    if(courseCategoryTreeDto.getChildrenTreeNodes()==null){
                        courseCategoryTreeDto.setChildrenTreeNodes(new ArrayList<CourseCategoryTreeDto>());
                    }
                    courseCategoryTreeDto.getChildrenTreeNodes().add(item);
                }
            }

        });

        //5. 返回结果
        return result;
    }

    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes1(String id) {
        return courseCategoryMapper.selectTreeNodes1(id);
    }
}
